#include<iostream>
#include<string>
#include<functional>

using namespace std;

void hello(string str)
{
    cout << str << endl;
}

int sum(int a,int b)
{
    return a + b;
}

class Test
{
    public:
    int sum(int a,int b)
    {
        return a + b;
    }
};

int main(){
    // bind是函数模板，可以自动推演模板类型参数，第一个参数是函数的指针
    bind(hello, "hello,world")(); 
    cout << bind(sum, 10, 20)() << endl;
    //bind使用函数对象的时候，必须要利用函数对象才能使用
    cout << bind(&Test::sum, Test(), 10, 20)()<<endl;

    // placeholders是占位符
    bind(hello, placeholders::_1)("hello,bind2!");
    bind(sum, placeholders::_1, placeholders::_2)(1, 3);

    function<void(string)> func1 = bind(hello, placeholders::_1);
    func1("hello,china!");
    func1("hello,shanghai!");
    return 0;
}